﻿﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Windows.Forms;

namespace CrossesGrav.WorkClasses
{
    class ArrDictionary<TKey, TValue>
    {
        public struct Data
        {
            public TKey key;
            public TValue value;
        }

        private TKey[] keys = new TKey[0];
        private TValue[] values = new TValue[0];

        /// <summary>
        /// Возвращает номер ячейки, содержащей указанный ключ
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public int FindIn(TKey t)
        {
            for (int i = 0; i < keys.Length; i++)
                if (t.ToString() == keys[i].ToString())
                    return i;
            return -1;
        }

        /// <summary>
        /// Меняет местами ячейки c указанными индексами 
        /// </summary>
        /// <param name="t1"></param>
        /// <param name="t2"></param>
        public void Replace(int Cell_1, int Cell_2)
        {
            TKey tempK;
            TValue tempV;

            tempK = keys[Cell_1];
            tempV = values[Cell_1];

            keys[Cell_1] = keys[Cell_2];
            values[Cell_1] = values[Cell_2];

            keys[Cell_2] = tempK;
            values[Cell_2] = tempV;
        }

        /// <summary>
        ///  Добавляет пару ключ-значение в конец словаря
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public void Add(TKey key, TValue value)
        {
            if (keys.Length != 0)
            {
                for (int i = 0; i < keys.Length; i++)
                {
                    if (keys[i].ToString() == key.ToString())
                    {
                        throw new ArgumentException("This <key> is already exist");
                    }
                }
                Array.Resize(ref keys, keys.Length + 1);
                Array.Resize(ref values, values.Length + 1);

                keys[keys.Length - 1] = key;
                values[values.Length - 1] = value;
            }
            else
            {
                Array.Resize(ref keys, 1);
                Array.Resize(ref values, 1);

                keys[0] = key;
                values[0] = value;
            }
        }

        /// <summary>
        /// Опустошает словарь
        /// </summary>
        public void Clear()
        {
            Array.Resize(ref keys, 0);
            Array.Resize(ref values, 0);
        }

        /// <summary>
        /// поиск ключей, соответствующих указанному значению
        /// </summary>
        /// <param name="val"></param>
        /// <returns></returns>
       /* public TKey GetKey(TValue val) // доделать поиск ключЕй, а не клЮча
        {
            for (int i = 0; i < keys.Length; i++)
            {
                if (values[i].ToString() == val.ToString())
                    return keys[i];
            }

            throw new ArgumentException("Wrong value", val.ToString());
        }*/

        /// <summary>
        /// Сортирует массив по возрастанию значений.
        /// ТОЛЬКО при числовых ключах.
        /// </summary>
        public void downSort_val()
        {
            TKey tmp_k;
            TValue tmp_v;

            for (int i = 0; i < values.Length; i++)
            {
                tmp_v = values[i];
                for (int j = 0; j < values.Length; j++)
                {
                    if (Convert.ToDouble(tmp_v) > Convert.ToDouble(values[j]))
                    {
                        tmp_v = values[j];
                        values[j] = values[i];
                        values[i] = tmp_v;

                        tmp_k = keys[j];
                        keys[j] = keys[i];
                        keys[i] = tmp_k;
                        j--;
                       // break;
                    }
                }
            }

        }

        /// <summary>
        /// Возвращает пару ключ-значение из ячейки с указанным индексом
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public Data GetData(int i)
        {
            if (i < keys.Length)
            {
                Data t = new ArrDictionary<TKey, TValue>.Data();
                t.key = keys[i];
                t.value = values[i];
                return t;
            }
            else throw new ArgumentOutOfRangeException();

        }

        /// <summary>
        /// Return value, whitch assotiated with "key" parameter
        /// ВОзвращает значение по указанному ключу
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public TValue this[TKey key]
        {
            get
            {
                for (int i = 0; i < keys.Length; i++)
                {
                    if (keys[i].ToString() == key.ToString())
                    {
                        TValue t = values[i];
                        return t;
                    }
                }
                throw new ArgumentOutOfRangeException();
            }
            set
            {

            }

        }
        /// <summary>
        /// Возвращает кол-во ячеек
        /// </summary>
        public Int32 Count
        {
            get
            {
                return keys.Length;
            }
        }
        /// <summary>
        /// Возвращает кол-во ячеек
        /// </summary>
        public Int32 Length
        {
            get
            {
                return keys.Length;
            }
        }

    }
}